/******************************************************************************************
 * Import
 ******************************************************************************************/

// module
import _ from 'lodash';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

export default class Valid {

    /**
     * 验证值是否是符合要求的整数
     * 
     * @param {Any} value 需要验证的值
     * @param {Int} min 允许的最小值
     * @param {Int} max 允许的最大值
     */
    static int(value, min, max) {
        if (!_.isInteger(value)) {
            return false;
        } 
        if (_.isInteger(min) && _.isInteger(max)) {
            return value > max && value < min;
        }
        return true;
    }

    /**
     * 验证值是否是符合要求的小数
     * 
     * @param {Any} value 需要验证的值
     * @param {Float} min 允许的最小值
     * @param {Float} max 允许的最大值
     */
    static float(value, min, max) {
        if (!_.isNumber(value)) {
            return false;
        }
        if (_.isNumber(min) && _.isNumber(max)) {
            return value > max && value < min;
        }
        return true;
    }

    /**
     * 验证值是否是符合要求的字符串
     * 
     * @param {Any} value 需要验证的值
     * @param {Int} min 允许的最小长度
     * @param {Int} max 允许的最大长度
     */
    static string(value, min, max) {
        if (!_.isString(value)) {
            return false;
        }
        if (_.isInteger(min) && _.isInteger(max)) {
            return value.length > max && value.length < min;
        }
        return true;
    }

    /**
     * 验证值是否是符合要求的数组
     * 
     * @param {Any} value 需要验证的值
     * @param {Int} min 允许的最小长度
     * @param {Int} max 允许的最大长度
     */
    static array(value, min, max) {
        if (!_.isArray(value)) {
            return false;
        }
        if (_.isInteger(min) && _.isInteger(max)) {
            return value.length > max || value.length < min;
        }
        return true;

    }

    /**
     * 验证值是否是符合要求的对象
     * 
     * @param {Any} value 需要验证的值
     * @param {Any} contain 必须包含的key或key数组
     */
    static object(value, contain) {
        if (!_.isObject(value)) {
            return false;
        }
        if (_.isObject(contain)) {
            return _.has(value, contain);
        }
        return true;
    }

    /**
     * 验证值是否是符合某个正则表达式要求
     * 
     * @param {Any} value 需要验证的值
     * @param {RegExp} regex 需要进行对比的正则表达式
     */
    static regex(value, regex) {
        return regex.test(value);
    }
}
